import TurndownService from 'turndown'
import { gfm } from 'turndown-plugin-gfm'

/**
 * HTML转Markdown
 * 支持GitHub Flavored Markdown扩展语法
 * 主要用于导出功能
 */
export function htmlToMarkdown(html: string): string {
  if (!html || html.trim() === '') {
    return ''
  }

  try {
    const turndownService = new TurndownService({
      headingStyle: 'atx', // 使用 # 标题风格
      codeBlockStyle: 'fenced', // 使用 ``` 代码块风格
      emDelimiter: '*', // 使用 * 作为斜体分隔符
      bulletListMarker: '-', // 使用 - 作为无序列表标记
      hr: '---' // 使用 --- 作为分隔线
    })

    // 支持GFM扩展（表格、删除线、任务列表）
    turndownService.use(gfm)

    // 自定义规则：保留任务列表
    turndownService.addRule('taskList', {
      filter: (node: HTMLElement) => {
        return (
          node.nodeName === 'LI' &&
          node.getAttribute &&
          node.getAttribute('data-type') === 'taskItem'
        )
      },
      replacement: (content: string, node: any) => {
        if (!node.getAttribute) return content
        const checked = node.getAttribute('data-checked') === 'true'
        return `${checked ? '- [x]' : '- [ ]'} ${content}\n`
      }
    })

    // 自定义规则：保留代码块语言标识
    turndownService.addRule('codeBlock', {
      filter: (node: HTMLElement) => {
        return node.nodeName === 'PRE' && node.firstChild?.nodeName === 'CODE'
      },
      replacement: (_content: string, node: any) => {
        const codeNode = node.firstChild as HTMLElement
        const language = codeNode.getAttribute('class')?.replace('language-', '') || ''
        const code = codeNode.textContent || ''
        return `\n\`\`\`${language}\n${code}\n\`\`\`\n`
      }
    })

    // 自定义规则：保留高亮文本
    turndownService.addRule('highlight', {
      filter: (node: HTMLElement) => {
        return node.nodeName === 'MARK'
      },
      replacement: (content: string) => {
        return `==${content}==`
      }
    })

    const markdown = turndownService.turndown(html)
    return markdown
  } catch (error) {
    console.error('[Markdown转换] HTML转Markdown失败', error)
    // 失败时尝试提取纯文本
    return extractPlainText(html)
  }
}

/**
 * 从HTML提取纯文本（降级方案）
 */
function extractPlainText(html: string): string {
  // 简单的HTML标签移除
  return html.replace(/<[^>]*>/g, '').trim()
}
